from functools import wraps
from app.Dao.TodoDao.TodoLogDao import TodoLogDAO
from app.Dao.TodoDao.TodoDao import TodoDAO  # 假设主任务DAO存在，用于更新专注时间
from sqlalchemy.exc import SQLAlchemyError


def update_main_task_focus_time(func):
    """
    装饰器：在日志操作（更新/创建/删除）后，自动更新主任务的累计专注时间
    要求：被装饰的方法需返回 (bool, result)，且 result 是 TodoLog 对象或 None（删除操作返回 None 时，需通过 kwargs 传 task_id）
    """

    @wraps(func)  # 保留被装饰函数的元信息（如函数名、文档字符串）
    def wrapper(*args, **kwargs):
        # 1. 先执行被装饰的原方法（如更新/创建/删除日志）
        success, result = func(*args, **kwargs)
        print(success, result)

        # 2. 只有原方法执行成功，才更新主任务专注时间
        if success:
            try:
                task_id = result.get('task_id')
                # 4. 若获取到 task_id，计算并更新主任务专注时间
                if task_id:
                    # 读取该任务的所有日志
                    _, task_logs = TodoLogDAO.get_todo_logs_by_condition(task_id=task_id)
                    # 计算累计专注时间
                    total_focus_time = sum(log.focus_time for log in task_logs.items)
                    # 更新主任务的专注时间（假设 TaskDAO 有 update_focus_time 方法）
                    TodoDAO.update_todo(task_id, focus_time=total_focus_time)
                    print(f"主任务 {task_id} 专注时间更新为：{total_focus_time} 分钟")
                else:
                    print('没有获取到taskid')

            except SQLAlchemyError as e:
                print(f"更新主任务专注时间失败（数据库错误）：{str(e)}")
            except Exception as e:
                print(f"更新主任务专注时间失败（未知错误）：{str(e)}")

        # 5. 保持原方法的返回值不变，不影响上层逻辑
        return success, result

    return wrapper
